package com.pomelo.base.core.util;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;

public class FileUtil {

    /**
     * @author mengbin
     * @date 2019年10月12日 下午2:31:05
     * @desc 读取文件到字节数据中
     * @param file
     * @return
     */
    public static byte[] readFileToByteArray(File file) {
        try {
            return FileUtils.readFileToByteArray(file);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @author mengbin
     * @date 2019年10月12日 下午2:30:51
     * @desc 读取文件到字符串
     * @param file
     * @return
     */
    public static String readFileToString(File file) {
        try {
            return removeBom(FileUtils.readFileToString(file, "utf-8"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @author mengbin
     * @date 2019年11月21日 下午7:17:23
     * @desc 读取字符串
     * @param is
     * @return
     */
    public static String readInputStreamToString(InputStream is) {
        try {
            return IOUtils.toString(is, "utf-8");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static String readClasspathFileToString(String path) {
        if (!path.startsWith("/")) {
            throw new RuntimeException("必须使用绝对路径");
        }
        return readClasspathFileToString(FileUtil.class, path);
    }

    public static String readClasspathFileToString(Class<?> clazz, String path) {
        InputStream is = null;
        try {
            is = clazz.getResourceAsStream(path);
            if (is != null) {
                return readInputStreamToString(is);
            }
            return null;
        } finally {
            IOUtils.closeQuietly(is);
        }
    }

    public static List<String> readInputStreamToLines(InputStream is) {
        try {
            return IOUtils.readLines(is, "utf-8");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static List<String> readClasspathFileToLines(String path) {
        if (!path.startsWith("/")) {
            throw new RuntimeException("必须使用绝对路径");
        }
        return readClasspathFileToLines(FileUtil.class, path);
    }

    public static List<String> readClasspathFileToLines(Class<?> clazz, String path) {
        InputStream is = null;
        try {
            is = clazz.getResourceAsStream(path);
            if (is != null) {
                return readInputStreamToLines(is);
            }
            return null;
        } finally {
            IOUtils.closeQuietly(is);
        }
    }

    /**
     * @author mengbin
     * @date 2019年10月12日 下午5:08:25
     * @desc 移除UTF-8 bom头
     * @param text
     * @return
     */
    public static String removeBom(String text) {
        int firstChar = (int) text.toCharArray()[0];
        if (firstChar == 65279) {
            text = text.substring(1);
        }
        return text;
    }

    /**
     * @author mengbin
     * @date 2019年10月12日 下午2:30:42
     * @desc 读取文件所有行
     * @param file
     * @return
     */
    public static List<String> readLines(File file) {
        try {
            return FileUtils.readLines(file, "utf-8");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @author mengbin
     * @date 2019年10月22日 下午3:57:32
     * @desc 按行写入
     * @param file
     * @param lines
     */
    public static void writeLines(File file, Collection<?> lines) {
        try {
            FileUtils.writeLines(file, "utf-8", lines);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @author mengbin
     * @date 2019年10月12日 下午2:30:27
     * @desc 将字符串写入文件
     * @param file
     * @param data
     */
    public static void writeStringToFile(File file, String data) {
        try {
            FileUtils.write(file, data, "utf-8");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @author mengbin
     * @date 2019年11月21日 下午6:52:10
     * @desc 将流写入文件
     * @param file
     * @param is
     */
    public static void writeInputStreamToFile(File file, InputStream is) {
        try {
            FileUtils.copyInputStreamToFile(is, file);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @author mengbin
     * @date 2019年10月12日 下午2:30:16
     * @desc 获取系统换行符
     * @return
     */
    public static String getLineSeparator() {
        return IOUtils.LINE_SEPARATOR;
    }

    /**
     * @author mengbin
     * @date 2019年10月30日 上午11:24:14
     * @desc 拷贝文件
     * @param srcFile
     * @param targetFile
     */
    public static void copyFile(File srcFile, File targetFile) {
        try {
            FileUtils.copyFile(srcFile, targetFile);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @author mengbin
     * @date 2019年10月31日 上午11:15:28
     * @desc 创建临时文件
     * @return
     */
    public static File createTempFile() {
        try {
            File file = File.createTempFile("tmp", null);
            return file;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static File createTempDir() {
        try {
            File dir = new File(FileUtils.getTempDirectory(), CommonUtil.uuid());
            if (!dir.exists()) {
                dir.mkdir();
            }
            return dir;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
